/*
* Copyright (c) 2014 Thomas Kratz
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.eiswind.magnolia.thymeleaf.base;
import com.google.inject.Provider;
import de.eiswind.magnolia.thymeleaf.dialect.MagnoliaDialect;
import de.eiswind.magnolia.thymeleaf.renderer.ThymeleafRenderer;
import info.magnolia.beanmerger.BeanMerger;
import info.magnolia.beanmerger.ProxyBasedBeanMerger;
import info.magnolia.cms.beans.config.ServerConfiguration;
import info.magnolia.cms.core.AggregationState;
import info.magnolia.cms.i18n.DefaultMessagesManager;
import info.magnolia.cms.i18n.I18nContentSupport;
import info.magnolia.cms.i18n.MessagesManager;
import info.magnolia.cms.security.AccessManager;
import info.magnolia.context.MgnlContext;
import info.magnolia.context.WebContext;
import info.magnolia.i18nsystem.I18nizer;
import info.magnolia.module.blossom.render.RenderContext;
import info.magnolia.module.blossom.template.BlossomTemplateDefinition;
import info.magnolia.objectfactory.ComponentProvider;
import info.magnolia.objectfactory.Components;
import info.magnolia.rendering.context.RenderingContext;
import info.magnolia.rendering.engine.RenderingEngine;
import info.magnolia.rendering.template.AreaDefinition;
import info.magnolia.rendering.template.RenderableDefinition;
import info.magnolia.rendering.template.variation.RenderableVariationResolver;
import info.magnolia.rendering.util.AppendableWriter;
import info.magnolia.templating.elements.AreaElement;
import info.magnolia.templating.functions.TemplatingFunctions;
import org.junit.After;
import org.junit.Before;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
import org.thymeleaf.spring4.SpringTemplateEngine;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import javax.annotation.Resource;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.Session;
import javax.jcr.Workspace;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* Created by Thomas on 24.12.2014.
*/
public class AbstractMockMagnoliaTest {
protected Node node;
protected ThymeleafRenderer renderer;
protected RenderableDefinition renderableDefinition;
protected RenderingContext renderingContext;
protected StringWriter stringWriter;
protected SpringTemplateEngine thymeEngine;
protected ComponentProvider componentProvider;
protected ServerConfiguration config;
protected RenderingEngine engine;
@Resource
private WebApplicationContext webApplicationContext;
@Before
public void setUp() throws Exception {
/** mock up magnolia */
node = mock(Node.class);
Session session = mock(Session.class);
Workspace workspace = mock(Workspace.class);
when(workspace.getName()).thenReturn("pages");
when(session.getWorkspace()).thenReturn(workspace);
when(session.hasPermission(any(), any())).thenReturn(true);
when(node.getSession()).thenReturn(session);
when(node.getPath()).thenReturn("/home");
NodeIterator nodeIterator = mock(NodeIterator.class);
when(nodeIterator.hasNext()).thenReturn(false);
when(node.getNodes()).thenReturn(nodeIterator);
HttpServletRequest request = new MockHttpServletRequest();
request.setAttribute(DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE, webApplicationContext);
HttpServletResponse response = new MockHttpServletResponse();
WebContext webCtx = mock(WebContext.class);
when(webCtx.getRequest()).thenReturn(request);
when(webCtx.getResponse()).thenReturn(response);
AggregationState state = mock(AggregationState.class);
when(state.getMainContentNode()).thenReturn(node);
// when(state.equals(state)).thenReturn(true);
when(webCtx.getAggregationState()).thenReturn(state);
AccessManager accessManager = mock(AccessManager.class);
when(accessManager.isGranted(anyString(), anyLong())).thenReturn(true);
when(webCtx.getAccessManager(anyString())).thenReturn(accessManager);
when(webCtx.getLocale()).thenReturn(Locale.ENGLISH);
MgnlContext.setInstance(webCtx);
config = mock(ServerConfiguration.class);
when(config.isAdmin()).thenReturn(true);
componentProvider = mock(ComponentProvider.class);
Components.setComponentProvider(componentProvider);
when(componentProvider.getComponent(ServerConfiguration.class)).thenReturn(config);
engine = mock(RenderingEngine.class);
when(componentProvider.getComponent(RenderingEngine.class)).thenReturn(engine);
Provider<AggregationState> provider = mock(Provider.class);
TemplatingFunctions templatingFunctions = new TemplatingFunctions(provider);
when(componentProvider.getComponent(TemplatingFunctions.class)).thenReturn(templatingFunctions);
I18nContentSupport i18nContentSupport = mock(I18nContentSupport.class);
when(i18nContentSupport.getDefaultLocale()).thenReturn(Locale.ENGLISH);
when(componentProvider.getComponent(I18nContentSupport.class)).thenReturn(i18nContentSupport);
RenderableVariationResolver variationResolver = mock(RenderableVariationResolver.class);
when(componentProvider.getComponent(RenderableVariationResolver.class)).thenReturn(variationResolver);
I18nizer i18nizer = mock(I18nizer.class);
when(componentProvider.getComponent(I18nizer.class)).thenReturn(i18nizer);
Components.pushProvider(componentProvider);
DefaultMessagesManager mgr = new DefaultMessagesManager();
when(componentProvider.getComponent(MessagesManager.class)).thenReturn(mgr);
when(componentProvider.getComponent(BeanMerger.class)).thenReturn(new ProxyBasedBeanMerger());
RenderContext.push();
RenderContext.get().setModel(new HashMap<>());
ServletContext servletContext = mock(ServletContext.class);
thymeEngine = new SpringTemplateEngine();
thymeEngine.addTemplateResolver(new ClassLoaderTemplateResolver());
thymeEngine.addDialect(new MagnoliaDialect());
renderer = new ThymeleafRenderer();
renderer.setApplicationContext(webApplicationContext);
renderer.setServletContext(servletContext);
renderer.setEngine(thymeEngine);
renderableDefinition = mock(RenderableDefinition.class);
renderingContext = mock(RenderingContext.class);
when(engine.getRenderingContext()).thenReturn(renderingContext);
AreaElement areaElement = new AreaElement(config, renderingContext, engine, variationResolver);
areaElement.setContent(node);
when(componentProvider.newInstance(eq(AreaElement.class), any())).thenReturn(areaElement);
stringWriter = new StringWriter();
AppendableWriter out = new AppendableWriter(stringWriter);
when(renderingContext.getAppendable()).thenReturn(out);
BlossomTemplateDefinition templateDefinition = mock(BlossomTemplateDefinition.class);
when(templateDefinition.getDialog()).thenReturn(null);
AreaDefinition areaDef = mock(AreaDefinition.class);
when(areaDef.getName()).thenReturn("Area");
when(areaDef.getEnabled()).thenReturn(true);
Map<String, AreaDefinition> areaMap = new HashMap<>();
areaMap.put("Area", areaDef);
when(templateDefinition.getAreas()).thenReturn(areaMap);
when(renderingContext.getRenderableDefinition()).thenReturn(templateDefinition);
when(i18nizer.decorate(templateDefinition)).thenReturn(templateDefinition);
}
@After
public void cleanup() {
Components.popProvider();
RenderContext.pop();
}
}